package com.lingxu.module.sjtjfx.tool;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.List;
import java.util.Optional;

public class TjfxTool {
    public static <TModel, Lyzl> void matchCatnameAndZlname(Page<TModel> modelPage, List<Lyzl> lyzls) {
        // 校验入参
        if (modelPage == null || modelPage.getRecords() == null || lyzls == null) {
            throw new IllegalArgumentException("入参不能为null");
        }

        // 遍历Page中的每个TModel对象
        for (TModel model : modelPage.getRecords()) {
            try {
                // 使用反射获取catname值
                String catname = getFieldValue(model, "catname");
                if (catname == null) {
                    continue;
                }

                // 查找匹配的Lyzl对象
                Optional<Lyzl> matchedLyzl = lyzls.stream()
                        .filter(lyzl -> lyzl != null)
                        .filter(lyzl -> {
                            String zlname = null;
                            try {
                                zlname = getFieldValue(lyzl, "zlname");
                            } catch (Exception e) {
                                throw new RuntimeException(e);
                            }
                            return zlname != null && catname.contains(zlname);
                        })
                        .findFirst();

                // 将匹配结果关联到model（假设model有setMatchedLyzl方法）
                matchedLyzl.ifPresent(lyzl -> {
                    try {
                        setFieldValue(model, "matchedLyzl", lyzl);
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }
                });

            } catch (Exception e) {
                // 捕获单个对象处理异常，不影响整体流程
                System.err.println("处理TModel对象时发生异常: " + e.getMessage());
            }
        }
    }

    /**
     * 反射获取对象字段值（支持getter方法或直接字段访问）
     */
    private static <T> String getFieldValue(T obj, String fieldName) throws Exception {
        if (obj == null) {
            return null;
        }

        // 优先通过getter方法获取
        try {
            String getterMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
            return (String) obj.getClass().getMethod(getterMethodName).invoke(obj);
        } catch (NoSuchMethodException e) {
            // 尝试直接访问字段
            java.lang.reflect.Field field = obj.getClass().getDeclaredField(fieldName);
            field.setAccessible(true);
            return (String) field.get(obj);
        }
    }

    /**
     * 反射设置对象字段值（支持setter方法或直接字段访问）
     */
    private static <T, V> void setFieldValue(T obj, String fieldName, V value) throws Exception {
        if (obj == null) {
            return;
        }

        // 优先通过setter方法设置
        try {
            String setterMethodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
            obj.getClass().getMethod(setterMethodName, value.getClass()).invoke(obj, value);
        } catch (NoSuchMethodException e) {
            // 尝试直接设置字段
            java.lang.reflect.Field field = obj.getClass().getDeclaredField(fieldName);
            field.setAccessible(true);
            field.set(obj, value);
        }
    }
}
